"""
Pandas数据源模块
"""
import pandas as pd
from loguru import logger
from .base import Feed


class PandasFeed(Feed):
    """
    基于Pandas的数据源实现
    """
    
    def __init__(self, timeline_cache_path=None):
        """
        初始化Pandas数据源
        
        Parameters
        ----------
        timeline_cache_path : str, optional
            时间轴缓存文件路径，如果文件存在则从文件加载时间轴
        """
        super().__init__(timeline_cache_path)
    
    def add_dataframe(self, instrument, df):
        """
        添加一个品种的数据
        
        Parameters
        ----------
        instrument : str
            交易品种代码
        df : pandas.DataFrame
            品种的数据，必须包含所有必需字段，且datetime为索引
        """
        if not isinstance(df, pd.DataFrame):
            logger.error("数据必须是pandas.DataFrame类型")
            raise TypeError("数据必须是pandas.DataFrame类型")
            
        if not isinstance(df.index, pd.DatetimeIndex):
            logger.error("数据索引必须是datetime类型")
            raise TypeError("数据索引必须是datetime类型")
        
        # 检查并标准化数据
        df = df.copy()
        df['symbol'] = instrument  # 确保symbol字段存在且正确
        
        # 将数据添加到字典中
        self._df[instrument] = df
        if instrument not in self._instruments:
            self._instruments.append(instrument)
        
        # 检查数据字段
        self._check_data_fields()
        
        logger.info(f"添加品种 {instrument} 的数据，共{len(df)}个时间点")
    
    
    def get_data_series(self, instrument, column_name='close'):
        """
        获取指定品种的特定数据序列
        
        Parameters
        ----------
        instrument : str
            交易品种代码
        column_name : str, optional
            数据列名，默认为'close'
            
        Returns
        -------
        pandas.Series
            数据序列
        """
        if instrument not in self._df:
            logger.error(f"未找到品种: {instrument}")
            return None
            
        if column_name not in self._df[instrument].columns:
            logger.error(f"品种 {instrument} 数据中未找到列: {column_name}")
            return None
            
        return self._df[instrument][column_name]
